package com.ahorresas.modelo.daos;

import com.ahorresas.conexion.Conexion;
import com.ahorresas.modelo.beans.UsuarioBean;
import com.ahorresas.modelo.sqls.UsuarioSql;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UsuarioDao {
    
    Conexion conexion = new Conexion();
    Connection con;
    UsuarioSql sql = new UsuarioSql();
    
    /**
     * Busca un usuario específico en la base de datos
     * @param identificacion
     * @param porNombre Indica si la consulta se va a hacer por nombre de usuario o por documento
     * @return 
     */
    public UsuarioBean buscarUsuario(String identificacion, boolean porNombre){
        con = conexion.getConexion();
        UsuarioBean usuario = null;
        try {
            PreparedStatement ps = null;
            if(porNombre)
                ps = con.prepareStatement(sql.buscarUsuarioPorNombre());
            else
                ps = con.prepareStatement(sql.buscarUsuarioPorDocumento());
            ps.setString(1, identificacion);
            
            ResultSet resultado = ps.executeQuery();
            if(resultado.next()){
                usuario = new UsuarioBean();
                usuario.setIdentificacion(resultado.getString("identificacion"));
                usuario.setNombre(resultado.getString("nombre"));
                usuario.setClave(resultado.getString("clave"));
                usuario.setPerfil(resultado.getInt("perfil"));
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
        finally{
            conexion.cerrarConexion(con);
        }
        return usuario;
    }
    
    public List<UsuarioBean> listarUsuarios(){
        con = conexion.getConexion();
        List<UsuarioBean> listaUsuarios = new ArrayList<>();
        UsuarioBean usuario = null;
        try {
            PreparedStatement ps = con.prepareStatement(sql.listarUsuarios());
            ResultSet resultado = ps.executeQuery();
            while(resultado.next()){
                usuario = new UsuarioBean();
                usuario.setIdentificacion(resultado.getString("identificacion"));
                usuario.setNombre(resultado.getString("nombre"));
                usuario.setClave(resultado.getString("clave"));
                usuario.setPerfil(resultado.getInt("perfil"));
                
                listaUsuarios.add(usuario);
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally{
            conexion.cerrarConexion(con);
        }
        return listaUsuarios;
    }
    
    public int crearUsuarios(UsuarioBean usuario){
        con = conexion.getConexion();
        int resultado = 0;
        try {
            PreparedStatement ps = con.prepareStatement(sql.crearUsuario());
            ps.setString(1, usuario.getIdentificacion());
            ps.setString(2, usuario.getNombre());
            ps.setString(3, usuario.getClave());
            ps.setInt(4, usuario.getPerfil());

            resultado = ps.executeUpdate();
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        } finally {
            conexion.cerrarConexion(con);
        } 
        return resultado;
    }
    
    public int modificarUsuario(UsuarioBean usuario){
        con = conexion.getConexion();
        int resultado = 0;
        try {
            PreparedStatement ps = con.prepareStatement(sql.modificarUsuario());
            ps.setString(1, usuario.getNombre());
            ps.setString(2, usuario.getClave());
            ps.setInt(3, usuario.getPerfil());
            ps.setString(4, usuario.getIdentificacion());
            
            resultado = ps.executeUpdate();
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            conexion.cerrarConexion(con);
        }
        return resultado;
    }
    
    public int eliminarUsuario(String identificacionUsuario){
        con = conexion.getConexion();
        int resultado = 0;
        try {
            PreparedStatement ps = con.prepareStatement(sql.eliminarUsuario());
            ps.setString(1, identificacionUsuario);
            
            resultado = ps.executeUpdate();
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            conexion.cerrarConexion(con);
        }
        return resultado;
    }
}
